﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using codeding.KMeans.DataStructures.Lists;
//using Microsoft.Office.Interop.Excel;
using System.Data.SqlClient;
using System.Data;

namespace codeding.KMeans.DataStructures
{
    public class BuildMatrixDoQuanTam
    {
        private BuildMatrixDoTuongTu _MatrixDoTuongTu;
        int _UserIDSignIn = -1;
        public int _SoHang;
        public int _SoCot;
        public double[,] _MaTran;

        //public BuildMatrixDoQuanTam()
        //{
        //    try
        //    {
        //        //KHởi tạo ma trận user item chứa kết quả mức độ quan tâm
        //        _MatrixDoTuongTu = new BuildMatrixDoTuongTu();
        //        _SoHang = _MatrixDoTuongTu._MatrixUsersItemsBase._SoHang;
        //        _SoCot = _MatrixDoTuongTu._MatrixUsersItemsBase._SoCot;
        //        InitMatran(_SoHang, _SoCot);
        //        FillDataMaTran();
        //    }
        //    catch (Exception ex)
        //    {
        //        throw new Exception(ex.Message);
        //    }
        //    finally
        //    {
        //    }
        //}
        public BuildMatrixDoQuanTam(int UsersSignIn, bool readFromFile)
        {
            try
            {
                _UserIDSignIn = UsersSignIn;
                //KHởi tạo ma trận user item chứa kết quả mức độ quan tâm
                _MatrixDoTuongTu = new BuildMatrixDoTuongTu(UsersSignIn, readFromFile);
                _SoHang = _MatrixDoTuongTu._MatrixUsersItemsBase._SoHang;
                _SoCot = _MatrixDoTuongTu._MatrixUsersItemsBase._SoCot;

                if (!readFromFile)
                {
                    InitMatran(_SoHang, _SoCot);
                    FillDataMaTran();
                    //Xuất file
                    RWFile.ExportToTextFile(_MaTran, _SoHang, _SoCot, "MatrixDoQuanTam");
                }
                else
                {
                    _MaTran = RWFile.ReadFromTextFile("MatrixDoQuanTam");
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
            }
        }

        //Khởi tạo ma trận với số hàng = số cột = số user trong danh mục.
        private void InitMatran(int soHang, int soCot)
        {
            this._MaTran = new double[soHang, soCot];

            for (int i = 0; i < soHang; i++)
            {
                for (int j = 0; j < soCot; j++)
                {
                    _MaTran[i, j] = 0;
                }
            }
        }

        private void FillDataMaTran()
        {
            //Bỏ qua UserID = 0
            for (int a = 1; a < _MatrixDoTuongTu._MatrixUsersItemsBase._SoHang; a++)
            {
                //if (a == _UserIDSignIn)
                //{
                    for (int j = 1; j < _MatrixDoTuongTu._MatrixUsersItemsBase._SoCot; j++)
                    {
                        _MaTran[a, j] = CalculateMucDoQuanTamByByUserID(a, j);
                    }

                    if (a > 0 && a % 50 == 0)
                    {
                        //Xuất file
                        RWFile.ExportToTextFile(_MaTran, _SoHang, _SoCot, "MatrixDoQuanTam");
                    }
                //}
            }
        }


        //Tính toán mức độ quan tâm
        private double CalculateMucDoQuanTamByByUserID(int userIDa, int movieIDj)
        {
            int[] l = DanhMucMovie.GetUserIDDaDanhGiaByMovieID(movieIDj);
            double ra = DanhMucUserAccount.DanhGiaTrungBinhByUser(userIDa);

            double tu = 0, mau = 0;
            double Paj = 0;

            for (int i = 0; i < l.Length; i++)
            {
                double ri = DanhMucUserAccount.DanhGiaTrungBinhByUser(l[i]);  //userID = l[i]

                tu += (_MatrixDoTuongTu._MatrixUsersItemsBase._MaTran[l[i], movieIDj] - ri) * _MatrixDoTuongTu._MaTran[userIDa, l[i]];
                mau += Math.Abs(_MatrixDoTuongTu._MaTran[userIDa, l[i]]);
            }
            if (mau != 0)
                Paj = ra + tu / Math.Abs(mau);
            return Paj;
        }
    }
}
